/**
 * Created by win on 2016/3/2 0002.
 * 基于jquery的校验插件，特殊的一个需求背景： 只要有一个错误就返回，并且本插件不处理其他的操作。只是校验。有错就返回；
 * 参数说明：
 *     var options = {
            rules: {        //规则列表，将按照列表顺序进行验证
                bankaccno: {    //元素的name值
                    regex：/[0-9]{16,19}/        //正则表达式 ，目前只能以这样的格式开始和结尾/你的表达式/
                    required: true,     //必须有值
                    method: function (element) { // 自定义方法：将把当前标签回调给该方法，不需要设置对应的messages
                        return;  //无返回结果，则表示正确，有返回结果(错误消息),将正常回调errorPlacement方法
                    },
                     methodNoCallback:function(elements){ //参数是标签数组
                        alert("本方法将不会回调任何方法，由该方法自己处理提示等信息,返回 true 表示通过校验，返回 false 则未通过校验");
                        return true;
                    }
                }
            },
            messages: {  //错误消息列表
                bankaccno: {    //对应规则列表中的顺序
                    regex: "长度必须在16-19",
                    required:"该字段必须存在"
                }
             },
            errorPlacement: function (element,errorMsg){  //有错误就回调该方法(根据不同的ruleType进行回调)element：当前标签元素 jquery 对象，errorMsg 错误提示消息
                errcode.errMessage(errorMsg); //自定义
            },
            submitHandler: function (scopeTarget){ //完全校验通过之后，会回调该方法 scopeTarget：是范围元素对象（$("#dhNextFrom").ihuiValidate(options);） 如果dhNextFrom是一个表单，那么你就可以使用表单的特性操作
                dhSubmit(scopeTarget);
            }
        }
     var validator = $("#dhNextFrom").ihuiValidate(options);
     validator.validate();  //校验操作

 -----------------------  使用示例
 $(function () {
    var validator = validateFrom();
    $("#submitBtn").on("click", function () {
        validator.validate();
    });
});

 function validateFrom() {
    var options = {
        rules: {
            "name": {
                regex: /[\u4e00-\u9fa5a-zA-Z]{2,16}/
            },
            "agree": {
                method: function (element) {
                    if (element.attr("checked") == true) {
                        return;
                    }
                    return "请阅读并勾选《服务条款》";
                }
            }
        },
        messages: {
            "name": {
                regex: "请填写长度为2-16的姓名"
            }
        }, errorPlacement: function (element, errorMsg) {
            errcode.errMessage(errorMsg);
        },
        submitHandler: function (scopeTarget) {
            var activeBtnTitle = me.attr("value");
            var disabledTitle = "正在处理中...";
            var newBtnDA = Ui.Btn.newBtnDA($submit);

        }
        }
        return $(".form").mrValidate(options);
    }
 */

;( function( window ) {
    'use strict';
    (function($) {
        $.extend($.fn, {
            mrcodeValidator:function(options){
                var target = $(this);
                return new Validator(target,options);
            }
        });
    }(jQuery));

    Validator = function (target, options) {
        /**规则配置等一切的配置参数*/
        this.options = options;
        this.target = target;
        /**范围对象，根据options中的配置name名称在该范围对象中匹配对应的标签对象*/
        options['scopeTarget'] = target
    }
    /**发起校验操作*/
    Validator.prototype.validate = function () {
        if (MrcodeValidator.validate(this.options)) {
            options.submitHandler(target);
        }
    }


    function validate(options) {
        var rules = options.rules;  //规则
        var messages = options.messages; //规则所对应的错误提示消息
        var errorPlacement = options.errorPlacement; //出错所调用的回调函数
        /**
         * elementName : 元素name属性的值
         * nameRules：每个元素对应的规则列表
         */
        var flag = true; //控制跳出循环,和返回结果
        $.each(rules, function (name, nameRules) {
            //console.log(name);
            var tags = options.scopeTarget.find("*").filter(function () {
                return $(this).attr("name") == name;
            });
            var __tag = getTag(tags);
            var tag = __tag.tag;
            var tagValue = __tag.tagValue;

            /**
             * ruleType : 规则类型
             * rule ：对应的规则
             */
            $.each(nameRules, function (ruleType, rule) {
                if ("regex" == ruleType) {
                    var msg = messages[name][ruleType];
                    var isMatch = rule.test(tagValue)
                    if (!isMatch) {
                        flag = callErrorPlacement(errorPlacement, tag, msg);
                        return flag;
                    }
                } else if ("required" == ruleType) {
                    var msg = messages[name][ruleType];
                    rule = (rule == "true");
                    if (isNull(tagValue)) {
                        flag = callErrorPlacement(errorPlacement, tag, msg);
                        return flag;
                    }
                } else if ("method" == ruleType) {
                    var result = rule(tag); //直接调用函数
                    if (result) {
                        errorPlacement(tag, result); //回调错误函数
                        flag = false;
                        return flag;
                    }
                    ;
                } else if ("methodNoCallback" == ruleType) {
                    var result = rule(tags);
                    if (!result) {
                        flag = false;
                        return flag;
                    }
                }
                //console.log(ruleType);
                //console.log(rule);
            });

            return flag;

        });
        return flag;
    }

    //是否为空;
    function isNull(value) {
        if (value === "") {
            return true;
        }
        return false;
    }

    /**
     * 回调错误函数
     * @param errorPlacement 错误函数
     * @param tag 当前标签
     * @param errMsg 错误消息
     * @returns {boolean} 返回false，标识有错误
     */
    function callErrorPlacement(errorPlacement, tag, errMsg) {
        errorPlacement(tag, errMsg);
        return false;
    }

    /**
     * 获取单个tag标签对象，和对应的值
     * @param tags
     * @returns {{tag: *, tagValue: *}}
     */
    function getTag(tags) {
        var tag = tags[0]; //取出唯一的标签
        var tagValue;
        var tagName = tag.tagName;
        if ("INPUT" == tagName) {  //是input元素
            tagValue = $(tag).val();
        } else if ("SELECT" == tagName) {
            tagValue = $(tag).val();
        } else if ("TEXTAREA" == tagName) {
            tagValue = $(tag).val();
        }
        return {tag: tag, tagValue: tagValue};
    }
})( window );


